const TimeUtils = {
    /**
     * 获取当前月份的第一天日期
     * @param useUTC 是否使用utc时间
     * @returns {Date}
     */
    getFirstDayOfCurrentMonth(useUTC){
        return TimeUtils.getFirstDayOfMonth(new Date(), useUTC);
    },

    /**
     * 获取当前月份的最后一天日期
     * @param useUTC 是否使用utc时间
     * @returns {Date}
     */
    getLastDayOfCurrentMonth(useUTC){
        return TimeUtils.getLastDayOfMonth(new Date(), useUTC);
    },

    /**
     * 获取参考时间所在月份的第一天日期
     * @param date 参考时间
     * @param useUTC 是否使用UTC
     * @returns {Date}
     */
    getFirstDayOfMonth(date, useUTC){
        return useUTC
            ? new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1))
            : new Date(date.getFullYear(),date.getMonth());
    },

    /**
     * 获取参考时间所在的月份的最后一天日期
     * @param date 参考时间
     * @param useUTC 是否使用UTC
     * @returns {Date}s
     */
    getLastDayOfMonth(date, useUTC){
        let dt = TimeUtils.getFirstDayOfMonth(date, useUTC);
        if(useUTC){
            dt.setUTCMonth(dt.getUTCMonth() + 1);
            dt.setUTCDate( 0 );
        }else{
            dt.setMonth(dt.getMonth() + 1);
            dt.setDate( 0 );
        }
        return dt;
    },

    /**
     * 获取指定月份的总天数
     * @param year 年份
     * @param month 月份
     * @returns {number}
     */
    getDaysOfMonth(year, month) {
        let dt = new Date(year, month + 1);
        dt.setDate( 0 );
        return dt.getDate();
    },

    /**
     * 获取当前时间所在月份的总天数
     * @returns {number}
     */
    getDaysOfCurrentMonth(){
        let dt = new Date();
        return TimeUtils.getDaysOfMonth(dt.getFullYear(), dt.getMonth());
    },

    /**
     * 日期前进几天
     * @param date 日期
     * @param days 前进的天数
     * @param useUTC 是否使用UTC
     */
    advanceDays(date, days, useUTC){
        TimeUtils.__advanceOrBackDays(date, Math.abs(days), useUTC);
    },

    /**
     * 日期退后几天
     * @param date 日期
     * @param days 前进天数
     * @param useUTC 是否使用UTC
     */
    backDays(date, days, useUTC){
        TimeUtils.__advanceOrBackDays(date, 0 - Math.abs(days), useUTC);
    },

    /**
     * 日期前进几个月
     * @param date 日期
     * @param months 前进月份
     * @param useUTC 是否使用UTC
     */
    advanceMonths(date, months, useUTC){
        TimeUtils.__advanceOrBackMonths(date, Math.abs( months), useUTC);
    },

    /**
     * 日期退后几个月
     * @param date 日期
     * @param months 退后月份
     * @param useUTC 是否使用UTC
     */
    backMonths(date, months, useUTC){
        TimeUtils.__advanceOrBackMonths(date, 0 - Math.abs( months), useUTC);
    },

    /**
     * 日期往前几年
     * @param date 日期
     * @param years 前进年份
     * @param useUTC 是否使用UTC
     */
    advanceYears( date, years, useUTC){
        TimeUtils.__advanceOrBackYears( date, Math.abs(years), useUTC);
    },

    /**
     * 日期退后几年
     * @param date 日期
     * @param years 退后年份
     * @param useUTC 是否使用UTC
     */
    backYears( date, years, useUTC){
        TimeUtils.__advanceOrBackYears(date, 0 - Math.abs(years), useUTC);
    },

    __advanceOrBackYears(date, years, useUTC){
        if(useUTC){
            date.setUTCFullYear( date.getUTCFullYear() + years);
        }else{
            date.setFullYear( date.getFullYear() + years);
        }
    },

    __advanceOrBackMonths(date, months,  useUTC){
        if(useUTC){
            date.setUTCMonth( date.getUTCMonth() + months);
        }else{
            date.setMonth( date.getMonth() + months);
        }
    },

    __advanceOrBackDays(date, days, useUTC){
        if(useUTC){
            date.setUTCDate( date.getUTCDate()+ days );
        }else{
            date.setDate( date.getDate() + days);
        }
    }
};

export default TimeUtils;